package model.rentals;

import java.util.ArrayList;
import java.util.HashMap;

import java.util.List;
import java.util.Map;

import model.events.AnnotationAddedEvent;
import model.events.AnnotationRemovedEvent;
import model.lendables.Lendable;

/**
 * Classe BookRental que representa livros. Um livro tem varias paginas, podem
 * associar-se anotacoes a cada pagina ou adicionar marcadores. Tambem regista
 * a ultima pagina acedida para ao revisitar o livro, o sistema continue a 
 * visualizacao a partir desta pagina
 * @author DCO37
 * 	N.º 42484 Helder Ferreira
 *  N.º 45509 Luis Ferreira
 */
public class BookRental extends Rental  {

	private Map<Integer,Page>  livro;
//	private Map<Integer, List<Page>>  livro;
	private int lastPageVisited;
	private List<Integer> marcadores;

	/**
	 * Construtor de BookRental dado um item(book)
	 * @param book - item
	 */
	public BookRental(Lendable book) {
		super(book) ;
		livro= new HashMap<Integer, Page>();
//		livro= new HashMap<Integer, List<Page>>();
		marcadores = new ArrayList<Integer>();
		//List<Page> aux = new ArrayList<Page>();
		
	}

	/**
	 * Adiciona uma anotacao a uma pagina do livro
	 * @param pageNum - numero de pagina 
	 * @param text - texto da anotacao
	 */
	public void addAnnotation(int pageNum, String text){
		//livro.put(pageNum, (List<Page>) new Page(pageNum));
		livro.get(pageNum);
		setChanged();
		notifyObservers(new AnnotationAddedEvent(this, pageNum));
	}

	/**
	 * Remove a n-esima anotacao da pagina do livro
	 * @param pageNum - numero de pagina
	 * @param n - n-esima posicao
	 */
	public void removeAnnotation(int pageNum, int n){
		livro.get(pageNum).removeAnnotation(n);
		setChanged();
		notifyObservers(new AnnotationRemovedEvent(this, pageNum));
	}

	/**
	 * Obtem as anotacoes de uma pagina do livro
	 * @param pageNum - numero de pagina
	 * @return lista de anotacoes de cada pagina
	 */
	public Iterable <String> getAnnotations(int pageNum){
		return livro.get(pageNum).getAnnotations();
	}

	/**
	 * Obtem a n-esima anotacao de uma pagina
	 * @param pageNum - numero de pagina
	 * @param n -  n-esima anotacao
	 * @return n-esima anotacao da pagina do livro
	 */
	public String getAnnotationText(int pageNum, int n){
		return livro.get(pageNum).getAnnotationText(n);
	}

	/**
	 * Verifica se a n-esima pagina tem anotacoes;
	 * @param n - n-esima 
	 * @return true se n-esima pagina do livro tiver anotacoes 
	 * ou false caso contrario
	 */
	public boolean hasAnnotations(int n){
		return livro.get(n).hasAnnotations();
	}

	/**
	 * Verifica se a n-esima pagina esta marcada
	 * @param n - n-esima pagina
	 * @return true se n-esima pagina do livro estiver marcada ou 
	 * false caso contrario
	 */
	public boolean isBookmarked(int n) {
		return livro.get(n).isBookmarked();
	}
	
	
	/**
	 * Obtem a lista de paginas marcadas
	 * @return lista de marcadores
	 */
	public List<Integer> getBookmarks () {
		for (Integer PageNum  : livro.keySet()) {  
			Page aux = livro.get (PageNum );  
			if (aux.isBookmarked()) {  
				marcadores.add(0, PageNum);  
			}  
		}
		return marcadores;
	}

	/**
	 * Marca a n-nesima pagina do livro caso nao esteja marcada, 
	 * e desmarca-a caso contrario
	 * @param n - n-esima pagina do livro
	 */
	public void toggleBookmark(int n){
		livro.get(n).toggleBookmark();
	}

	/**
	 * Devolve a ultima pagina consultada pelo utilizador
	 * @return lastPageVisited
	 */
	public int getLastPageVisited(){
		return this.lastPageVisited;
	}

	/**
	 * Actualiza a ultima pagina visitada
	 * @param lastPageVisited
	 */
	public void setLastPageVisited ( int lastPageVisited ) {
		this.lastPageVisited=lastPageVisited;
	}

}
